package com.xsp.dao.Impl;

import com.xsp.dao.BankDao;
import com.xsp.entity.Bank;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;


/**
 * @author xsp
 * @date 2024/1/22
 * @desc
 */
//@Repository
public class BankDaoImpl implements BankDao {
    @Resource
    private JdbcTemplate jdbcTemplate;

    @Override
    public int update(Bank bank) {
        String sql = "update bank set money=? where id=?";
        return jdbcTemplate.update(sql, bank.getMoney(), bank.getId());
    }

    @Override
    // 声明自己被调用时，外部不能有事务，若有，则直接抛异常
//    @Transactional(propagation = Propagation.NEVER)
    // 声明不要事务，若外部有事务，则挂起外部的事务，外部若回滚，对其不会有影响
    // 若内部没有异常，提交保存到数据库，若有，不回滚
//    @Transactional(propagation = Propagation.NOT_SUPPORTED)
    // 声明事务可有可无：若调用处有事务，则使用调用处的事务
    // 若调用处没有，则不用事务
//    @Transactional(propagation = Propagation.SUPPORTS)
    // 默认事务行为：若调用处有事务，就使用该事务，否则自己创建
    // 若外部有事务，谁有异常都全部回滚，若外部没有，自己没异常则提交，有则回滚
//    @Transactional(propagation = Propagation.REQUIRED)
    // 不管调用处是否有事务，都会创建新事务，挂起调用处的事务
    // 异常情况：发生在自己内部，回滚，默认也会触发外部的回滚
    // 发生在外部，则调用处回滚时，不会影响内部
//    @Transactional(propagation = Propagation.REQUIRES_NEW)
    // 嵌套事务， 如果调用处没有事务，就自己创建一个新的事务，
    // 如果有，就把自己嵌套到当前事务中，外嵌套事务， 如果调用处没有事务，就自己创建一个新的事务，如果有，就把自己嵌套到
    //当前事务中，外面的事务，会影响里面的事务，里面的事务，也会影响外面的事务。面的事务，会影响里面的事务，里面的事务，也会影响外面的事务。
    // 要回滚就一起回滚（理解为共用一个connection）
//    @Transactional(propagation = Propagation.NESTED)
    // 强制事务，如果调用处，没有事务，就抛出异常，
    // 如果调用处有事务，就使用当前调用处的事务（要么全部执行成功，要么全部失败）
    @Transactional(propagation = Propagation.MANDATORY)
    public int delete(Integer id) {
        String sql = "delete from bank where id=?";
        int update = jdbcTemplate.update(sql, id);
//        int a = 10 / 0;
        return update;
    }
}
